﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Web.Security;
using Freejobber.Core.Data;
using Freejobber.Core.Generic.Profile;
using System.Security.Principal;

namespace Freejobber.Core.Generic.Security
{
    public class SecurityManager
    {
        static HttpSessionState Session = HttpContext.Current.Session;
        private static db_freejobberEntities dbContext = db_freejobberEntities.GetConnecton();
        
        #region Login

        /// <summary>
        /// Выполнен ли вход в систему.
        /// </summary>
        /// <returns></returns>
        public static bool IsUserLogon()
        {
            if (GetCurrentUser() != null)
                return true;
            return false;
        }

        public static void SignOut()
        {
            Session["CurrentUser"] = null;
            Session.RemoveAll();
            Session.Clear();
            Session.Abandon();
        }
        public static UserClass GetCurrentUser()
        {
            UserClass _user=null;
            if (Session["CurrentUser"] != null)
            {
                try
                {
                    if (Session["CurrentUser"] is UserClass)
                    {
                        _user = Session["CurrentUser"] as UserClass;
                        AuthenticatUser(_user.LoginName);
                    }
                }
                catch
                {
                    return null;
                }
            }
            return _user;
        }

        /// <summary>
        /// Вход пользователя на сайт
        /// </summary>
        public static bool UserLogin(string login, string password)
        {
            if (CheckLoginAccount(login, password))
            {
                AuthenticatUser(login);//Если пароль ОК, регистрируем авторизацию пользователя
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Проверка соответствия логин и пароль.
        /// </summary>
        private static bool CheckLoginAccount(string login, string password)
        {
            bool result = false;
            string encodePass = GetMD5Hash(password);
            result = dbContext.tbl_Users.Any(x => x.LoginName == login && x.Password == encodePass);
           // result = dbContext.tbl_Users.Any(x => x.LoginName == login && x.Password == password);
            return result;
        }

        private static void AuthenticatUser(string loginName)
        {
            var user = UserManager.GetUserByLogin(loginName);
           //Возможно где-то будет более необходимый Save с которым и обновим поле активности
            if (DateTime.Now.Subtract((DateTime)user.Lastactivity).Minutes > 15)
            {
                user.Lastactivity = DateTime.Now;
                user.Save();
            }
            Session["CurrentUser"] = user;
            Session.Timeout=30;
            //
        }
        #endregion

        #region MD5

        public static string GetMD5Hash(string input)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            input = s.ToString();
            return input;
        }

        #endregion
    }
}